package com.liuhouse.controller;

import com.liuhouse.pojo.Menu;
import com.liuhouse.service.IMenuService;
import com.liuhouse.utils.ResponseResult;
import com.liuhouse.utils.SystemConverter;
import com.liuhouse.vo.MenuTreeVo;
import com.liuhouse.vo.MenuVo;
import com.liuhouse.vo.RoleMenuTreeSelectVo;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

@RestController
@RequestMapping("/system/menu")
public class MenuController {

    @Resource
    private IMenuService menuService;


    //查询菜单列表
    @GetMapping("/list")
    public ResponseResult list(Menu menu){
        List<MenuVo> menuVos = menuService.selectMenuList(menu);
        return ResponseResult.okResult(menuVos);
    }


    //新增菜单
    //不管前端是什么样的样式  总之 对于后端来说  就是一个对象的数据   然后最终添加到数据表中
    //这些数据都是由前端组织好传递过来的
    @PostMapping
    public ResponseResult add(@RequestBody Menu menu){
        menuService.save(menu);
        return ResponseResult.okResult();
    }

    //修改菜单 - 菜单回显
    @GetMapping(value = "/{menuId}")
    //先根据菜单id查询出对应的菜单的权限信息
    public ResponseResult getInfo(@PathVariable(value = "menuId") Long menuId){
        Menu menu = menuService.getById(menuId);
        return ResponseResult.okResult(menu);
    }


    @PutMapping
    //更新菜单操作
    public ResponseResult edit(@RequestBody Menu menu){
        //判断，如果当前的菜单的id等于自己的父菜单的话 这是不允许的 所以 要报错
        if(menu.getId().equals(menu.getParentId())){
            return ResponseResult.errorResult(500 , "修改菜单"+menu.getMenuName()+"失败");
        }
        //进行真正的修改菜单操作
        menuService.updateById(menu);
        return ResponseResult.okResult();
    }


    //删除菜单
    @DeleteMapping("/{meunId}")
    public ResponseResult remove(@PathVariable Long meunId){
        if(menuService.hasChild(meunId)){
            return ResponseResult.errorResult(500 , "存在子菜单不允许删除");
        }
        menuService.removeById(meunId);
        return ResponseResult.okResult();
    }


    //新增角色 - 获取菜单下拉树列表
    //后端按照前端的要求返回对应的格式  这里使用了递归
    @GetMapping("/treeselect")
    public ResponseResult treeselect(){
        //复用之前的selectMenuList方法,方法需要参数,参数可以用来进行条件查询,而这个方法是不需要条件的,所以直接new Menu()传入
        List<MenuVo> menus = menuService.selectMenuList(new Menu());
        List<MenuTreeVo> menuTreeVos = SystemConverter.buildMenuSelectTree(menus);
        return ResponseResult.okResult(menuTreeVos);
    }


    //修改角色 - 根据角色id查询对应角色菜单列表树
    @GetMapping(value = "/roleMenuTreeselect/{roleId}")
    public ResponseResult roleMenuTreeselect(@PathVariable("roleId") Long roleId){
        //查询所有的菜单
        List<MenuVo> menus = menuService.selectMenuList(new Menu());
        //查询当前角色选中的菜单 [有的东西就是刚开始不知道是什么作用，不知道为什么要这样做,那么你要做的就是继续向下做，到时候大概率会懂]
        List<Long> checkedKeys = menuService.selectMenuListByRoleId(roleId);
        List<MenuTreeVo> menuTreeVos = SystemConverter.buildMenuSelectTree(menus);
        //构建返回给前端的对象  选中的菜单id数组   树形菜单结构
        RoleMenuTreeSelectVo vo = new RoleMenuTreeSelectVo(checkedKeys, menuTreeVos);
        return ResponseResult.okResult(vo);
    }





}
